package ooday04exercise;

import ooday04.Master;

public class Test {
    private Master ee;

    public static void main(String[] args) {


        //演示向上造型第一点应用：将不同对象(狗、鱼、鸡)统一封装到一个数组(动物数组)中来访问，实现代码复用
        Animal[] animals=new Animal[5];
        //超类型的引用指向派生类的对象--向上造型
        animals[0]=new Dog("小黑",2,"黑色");
        animals[1]=new Dog("大黄",1,"黄色");
        animals[2]=new Fish("金鱼",2,"金色");
        animals[3]=new Fish("鲫鱼",2,"黑色");
        animals[4]=new Chick("小花",2,"花色");
        for(int i=0;i<animals.length;i++){
            //能点出来什么，看引用的类型，引用的类型是Animal,所以只能点出Animal类里面的属性和方法
            System.out.println(animals[i].name);
            animals[i].drink();
            animals[i].eat();
           //若想调用派生类特有的方法，要把引用类型转换为对应对象的类型,即强制类型转换
            //判断是否能转换条件：1）引用类型指向的派生类对象，就是该类型，即要转换成 的类型2）引用类型指向 的对象，实现了该接口或类
            if (animals[i] instanceof Dog){//引用类型指向的对象指向Dog对象
                Dog dogs=(Dog) animals[i];
                dogs.lookHome();
            }
            if (animals[i] instanceof Chick){//引用类型指向的对象指向Chick类对象
                Chick chick=(Chick)animals[i];
                chick.layEggs();
            }
            if (animals[i] instanceof Swim){//引用类型指向的对象为实现Swim()接口
                Swim swim=(Swim) animals[i];
                swim.swim();
            }
        }
        //将超类型(Animal)作为参数或返回值类型，传递或返回派生类(Dog/Fish/Chick)对象，以扩大方法的应用范围(所有Animal)，实现代码复用
        Master master=new Master();
        Dog dog=new Dog("小黑",2,"黑色");
        Chick chick=new Chick("花花",2,"花色");
        Fish fish=new Fish("金金",1,"金色");
//        master.feed(dog);//作了自动类型转换，Animal dog=new Dog("小黑",2,"黑色");????
//        master.feed(chick);
//        master.feed(fish);

        Animal o=new Dog("小贝",2,"白色");//向上造模，
        Dog dog1=(Dog) o;//向下转换，引用类型的对象是Dog类型，所以可以转换为Dog类型
//        Fish fish1=(Fish)o;//编译时发生类型转换错误
        Swim swim1=(Swim)o;//应用类型指向的对象实现了swim接口，所以引用类型可以转换为Swim类型
        System.out.println(o instanceof Dog);//true
        System.out.println(o instanceof Fish);//false
        System.out.println(o instanceof Swim);//true





    }
}
